﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Recursos.Model;
using System.Drawing;
using System.Globalization;

namespace Recursos.View
{
    public partial class AgendaView : System.Web.UI.Page
    {
        static private int[] mapReservaciones;
        static private Button[] mapBotones;
        static private int indiceActivo;

        protected void Page_Load(object sender, EventArgs e)
        {
            mapBotones = new Button[14] { but07, but08, but09, but10, but11, but13, but14, but15, but16, but17, but18, but19, but20, but21 };
            var userSecurity = ((Usuario)Session["UserLogged"]);
            

            if (!Page.IsPostBack && userSecurity != null)
            {
                CargarEspacios();

                DateTime elegida;
                if (Session["fechaDesp"] != null)
                    elegida = DateTime.Parse((string)Session["fechaDesp"]);
                else
                    elegida = DateTime.Now.Date;
                Calendar1.SelectedDate = Calendar1.VisibleDate = elegida;

                if (Session["espacioDesp"] != null)
                    DropDownEspacios.SelectedValue = (string)Session["espacioDesp"];

                DibujarDia();

            }
            else if (userSecurity == null)
            {
                Response.Redirect("~/NoAccess.aspx");
            }
        }

        private void CargarEspacios()
        {
            var espacios = new EspacioModel();
            DropDownEspacios.DataSource = espacios.CargarEspacios();
            DropDownEspacios.DataTextField = "Codigo";
            DropDownEspacios.DataValueField = "id";
            DropDownEspacios.DataBind();
        }

        private void DibujarDia()
        {
            LimpiarDespliegue();
            mapReservaciones = new int[14];

            DateTime fechaDespliegue = Calendar1.SelectedDate;
            CultureInfo espanol = new CultureInfo("es-ES");
            labelFecha.Text = fechaDespliegue.ToString("ddddddddd dd \\de MMMMMMMMM \\de yyyy", espanol);

            var model = new RservacionModel();
            var reservaciones = model.CargarReservacionesEspacioAnno(Convert.ToInt32(DropDownEspacios.SelectedValue), fechaDespliegue.Year);
            var reservacionesP = model.CargarReservacionesParticualresEspacioAnno(Convert.ToInt32(DropDownEspacios.SelectedValue), fechaDespliegue.Year);

            loopReservaciones(reservaciones);
            loopReservacionesP(reservacionesP);
        }

        private void loopReservaciones(IEnumerable<ReservacionCurso> reservaciones)
        {
            foreach (ReservacionCurso reservacion in reservaciones)
            {
                reservacionPeriodica(reservacion.Reservacion, Color.Gray, reservacion.id);
            }
        }

        private void reservacionPeriodica(Reservacion res, Color col, int id)
        {
            var fechaDesp = Calendar1.SelectedDate;
            var dia = letraDia(fechaDesp);
            if (res.FechaInicio <= fechaDesp && fechaDesp <= res.FechaFinal)
            {
                if (res.Dias.Contains(dia))
                {
                    string controlBoton = "but" + res.HoraInicio.Split(':')[0];
                    var inicio = Array.IndexOf(mapBotones, (Button)tablaPrincipal.FindControl(controlBoton));
                    for (int j = 0; j < res.Bloques; j++)
                    {
                        Button cuadro = mapBotones[inicio + j];
                        cuadro.BackColor = col;
                        cuadro.Enabled = true;
                        mapReservaciones[inicio + j] = id;
                    }
                }
            }
        }

        private void loopReservacionesP(IEnumerable<ReservacionParticular> reservaciones)
        {
            var fechaDesp = Calendar1.SelectedDate;
            foreach (ReservacionParticular reservacion in reservaciones)
            {
                if (reservacion.Reservacion.FechaInicio == reservacion.Reservacion.FechaFinal)
                {
                    if (reservacion.Reservacion.FechaInicio == fechaDesp)
                    {
                        string controlBoton = "but" + reservacion.Reservacion.HoraInicio.Split(':')[0];
                        var inicio = Array.IndexOf(mapBotones, (Button)tablaPrincipal.FindControl(controlBoton));
                        for (int j = 0; j < reservacion.Reservacion.Bloques; j++)
                        {
                            Button cuadro = mapBotones[inicio + j];
                            cuadro.BackColor = Color.Tan;
                            cuadro.Enabled = true;
                            mapReservaciones[inicio + j] = reservacion.id;
                        }
                    }
                }
                else
                    reservacionPeriodica(reservacion.Reservacion, Color.Tan, reservacion.id);
            }
        }

        private void LimpiarDespliegue()
        {
            foreach (Button bot in mapBotones)
            {
                bot.BackColor = Color.White;
                bot.Enabled = false;
            }
            TextBoxDetalles.Text = TextBoxComentar.Text = "";
        }

        protected void ClickEspacio(Object sender, EventArgs e)
        {
            DibujarDia();
        }

        private void MostrarDetalles()
        {
            TextBoxComentar.Text = "";
            string detalles = "";
            int idReservacion = mapReservaciones[indiceActivo];
            var model = new RservacionModel();
            var modelComentarios = new ComentariosModel();

            if (mapBotones[indiceActivo].BackColor == Color.Gray)
            {
                detalles += model.ObtenerDetallesReservacion(Convert.ToInt32(idReservacion), true);
                detalles += modelComentarios.ObtenerComentariosReservacion(idReservacion);
            }
            else
            {
                detalles += model.ObtenerDetallesReservacionParticular(Convert.ToInt32(idReservacion), true);
                detalles += modelComentarios.ObtenerComentariosReservacionParticular(idReservacion);
            }

            TextBoxDetalles.Text = detalles;
            butComentar.Enabled = true;
        }


        protected void ClickRecuadro(Object sender, EventArgs e)
        {
            Button cuadro = (Button)sender;
            int index = Array.IndexOf(mapBotones, cuadro);
            indiceActivo = index;
            MostrarDetalles();
        }

        protected void ClickSemana(Object sender, EventArgs e)
        {
            Session["fechaDesp"] = inicioSemana(Calendar1.SelectedDate);
            Session["espacioDesp"] = DropDownEspacios.SelectedValue;
            Response.Redirect("~/View/AgendaSemanaView.aspx");
        }

        protected void ClickMes(Object sender, EventArgs e)
        {
            DateTime primeroMes = new DateTime(Calendar1.SelectedDate.Year, Calendar1.SelectedDate.Month, 1);
            Session["fechaDesp"] = inicioSemana(primeroMes);
            Session["espacioDesp"] = DropDownEspacios.SelectedValue;
            Response.Redirect("~/View/AgendaMesView.aspx");
        }

        protected void ClickCalendario(Object sender, EventArgs e)
        {
            DibujarDia();
        }

        protected void ClickComentar(Object sender, EventArgs e)
        {
            var modelComentarios = new ComentariosModel();
            int idReservacion = mapReservaciones[indiceActivo];
            int resultado;

            if (mapBotones[indiceActivo].BackColor == Color.Gray)
            {
                resultado = modelComentarios.AgregarComentario(idReservacion, TextBoxComentar.Text, DateTime.Now, "usuario");
            }
            else
            {
                resultado = modelComentarios.AgregarComentarioParticular(idReservacion, TextBoxComentar.Text, DateTime.Now, ((Usuario)Session["UserLogged"]).Nombre);
            }

            if (resultado != 0)
            {
                WebMsgBox.Show("Su comentario ha sido agregado exitosamente", "Agenda");
                MostrarDetalles();
            }
        }

        string letraDia(DateTime fechaDespliegue)
        {
            switch (fechaDespliegue.DayOfWeek)
            {
                case DayOfWeek.Monday:
                    return "L";
                case DayOfWeek.Tuesday:
                    return "K";
                case DayOfWeek.Wednesday:
                    return "M";
                case DayOfWeek.Thursday:
                    return "J";
                case DayOfWeek.Friday:
                    return "V";
                case DayOfWeek.Saturday:
                    return "S";
                default:
                    return "";
            }
        }

        string inicioSemana(DateTime fecha)
        {
            int diff = fecha.DayOfWeek - DayOfWeek.Monday;
            if (diff < 0)
            {
                diff += 7;
            }
            return fecha.AddDays(-1 * diff).ToString();
        }
    }
}